home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #11 (Aug 86) / pascal / RegMDEF Source / RegMDEFGlue.Asm < prev    next >
Assembly Source File  |  1986-06-12  |  3KB  |  105 lines

  1. ;################################################################################
  2. ;#                                        #
  3. ;#    procedure GetItemKey(theMenu : MenuHandle;                #
  4. ;#                theItem : Integer;                #
  5. ;#                var theChar : Char);                #
  6. ;#                                        #
  7. ;#------------------------------------------------------------------------------#
  8. ;#                                        #
  9. ;#    This assembly proc returns the current command key which is assigned    #
  10. ;#    to theItem.                                #
  11. ;#                                        #
  12. ;################################################################################
  13.  
  14. ;------------------------------------ Equates -----------------------------------
  15.  
  16. ; menuinfo data structure
  17.  
  18.     menuID        equ    0    ; unique id for menu bar [word]
  19.     menuWidth    equ    2    ; menu Width [word]
  20.     menuHeight    equ    4    ; menu Height [word]
  21.     menuDefHandle    equ    6    ; menu definition proc [handle]
  22.     menuEnable    equ    $A    ; enable flags, one bit/item [long]
  23.     menuData    equ    $E    ; menu item string [string]
  24.     menuBlkSize    equ    $E    ; size of a menu block plus dataString
  25.  
  26. ; menu string data structure
  27.  
  28.     itemIcon    equ    0    ; icon byte
  29.     itemCmd        equ    1    ; command key byte
  30.     itemMark    equ    2    ; checkmark character byte
  31.     itemStyle    equ    3    ; style byte
  32.  
  33.     .Trap    _CountMItems    $A950    ; trap word 
  34.  
  35. ;------------------------------------ XREF's ------------------------------------
  36.  
  37.     xdef    GetItemKey        ; so the linker will find us
  38.  
  39. ;----------------------------------- Entrance -----------------------------------
  40.  
  41. GetItemKey:
  42.     link    A6,#0            ; create new stack frame
  43.     movem.l    A0-A4/D0-D3,-(SP)    ; save registers
  44.  
  45. ;------------------------------- Pop Parameters ---------------------------------
  46.  
  47.     clr.l    D2            ; make sure it is empty
  48.     clr.l    D1            ; ditto...
  49.     clr.l    D0            ; ditto...
  50.  
  51.     clr.w    -(SP)            ; make room for result
  52.     move.l    14(A6),-(SP)        ; push MenuHandle
  53.     _CountMItems            ; how many are in this menu?
  54.     move.w    (SP)+,D3        ; pop result
  55.  
  56.     move.l    14(A6),A4        ; fetch the menu handle
  57.     move.w    12(A6),D1        ; fetch the item number
  58.     movea.l    8(A6),A3        ; fetch ptr to the char Ptr(word)
  59.  
  60.     cmp.w    D1,D3            ; is num Of Menu Items < theItem
  61.     blt    BadItem            ; yep, exit
  62.  
  63. ;------------------------------ Find the Cmd Key --------------------------------
  64.  
  65.     move.l    (A4),A4            ; get menu ptr
  66.     lea    menuData(A4),A4        ; now A4 points to the menu title
  67.     move.b    (A4),D2            ; get length of menu title
  68.     add.b    #1,D2            ; skip length byte
  69.  
  70. ; (A4,D2) now points to the first menu items title (length byte)
  71.  
  72. nextItem:
  73.     sub.b    #1,D1            ; decrement count
  74.     beq    GotItem            ; if 0, return its cmd char
  75.     move.b    (A4,D2),D0        ; get length of the title
  76.     add    D0,D2            ; and skip it
  77.     add    #5,D2            ; skip the item attributes & length byte
  78.     bra    nextItem        ; and look at the next item
  79.  
  80. ;-------------------------------- Got the Item ----------------------------------
  81.  
  82. GotItem:
  83.     move.b    (A4,D2),D0        ; get length of title
  84.     add    D0,D2            ; and skip it
  85.     add    #1,D2            ; skip length byte, too...
  86.     clr.w    D0            ; make sure its empty
  87.     move.b    itemCmd(A4,D2),D0    ; get the key equivalent
  88.     move.w    D0,(A3)            ; and return it
  89.     bra    Exit            ; and exit
  90.  
  91. ;-------------------------------- No Item Found ---------------------------------
  92.  
  93. BadItem:
  94.     clr.w    (A3)            ; return no cmd char and exit
  95.     
  96. ;------------------------------- Clean Up & Exit --------------------------------
  97.  
  98. Exit:
  99.     movem.l    (SP)+,A0-A4/D0-D3    ; restore registers
  100.     unlk    A6            ; restore stack frame
  101.     movea.l    (SP)+,A0        ; save return address
  102.     adda.l    #10,SP            ; clean up stack
  103.     jmp    (A0)            ; ... and return
  104.  
  105.